package com.fight.util.ftp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FtpUtil {

	private static FTPClient ftpClient;
	
	/**
	 * Description: 向FTP服务器上传文件 @Version1.0 zhzy
	 * 
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param inputStream
	 * 			    上传图片的流        
	 * @param input
	 *            输入流
	 * @return 成功返回true，否则返回false
	 */
	public static boolean uploadFile(FTPClient ftpC,String filename, InputStream inputStream) {
		boolean success = false;
		try {
			ftpClient.setBufferSize(1024);
        	ftpClient.setControlEncoding("GBK");
        	ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        	success = ftpClient.storeFile(filename, inputStream);
        	if(success){
        		return true;
        	}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * Description: 从FTP服务器下载文件 @Version1.0 zhzy
	 * 
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @param localPath
	 *            下载后保存到本地的路径
	 * @return
	 */
	public static String downFile(FTPClient ftpC,Ftp ftp, String fileName, String localPath) {
		try {
			// 设置文件类型（二进制）
			ftpC.setFileType(FTPClient.BINARY_FILE_TYPE);
			FTPFile[] fs = ftpC.listFiles();
			//如果文件夹不存在执行添加操作
			File file = new File(localPath);
			if(!file.exists()){
				file.mkdirs();
			}
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					File localFile = new File(localPath + fileName);
					OutputStream is = new FileOutputStream(localFile);
					ftpC.retrieveFile(fileName, is);
					is.flush();
					is.close();
					break;
				}
			}
			return  "img/"+fileName;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	* @Title: loginFtpInfo
	* @Description: TODO(登录FTP)
	* @param @param ftp
	* @param @throws SocketException
	* @param @throws IOException    设定文件
	* @return void    返回类型
	* @author: zhzy
	* @date 2016年12月1日 上午9:59:15
	* @throws
	*/
	public static FTPClient loginFtpInfo(Ftp ftp) throws SocketException, IOException{
		ftpClient = new FTPClient();
		int reply;
		ftpClient.connect(ftp.getIpAddr(), ftp.getPort());
		// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
		ftpClient.login(ftp.getUserName(), ftp.getPassword());// 登录
		reply = ftpClient.getReplyCode();
		if (!FTPReply.isPositiveCompletion(reply)) {
			ftpClient.disconnect();
		}
		// 转移到FTP服务器目录
		ftpClient.changeWorkingDirectory(ftp.getPath());
		return ftpClient;
	}
	
	/**
	* @Title: isDeleteImg
	* @Description: TODO(删除FTP图片)
	* @param @param ftpC
	* @param @param fileName
	* @param @return    设定文件
	* @return boolean    返回类型
	* @author: zhzy
	* @date 2016年12月6日 上午10:24:17
	* @throws
	*/
	public static boolean isDeleteImg(FTPClient ftpC,String fileName){
		boolean isDelet = false;
		try {
			isDelet = ftpClient.deleteFile(fileName);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return isDelet;
	}
	
	
	/**
	* @Title: closeFtp
	* @Description: TODO(关闭FTP连接)
	* @param     设定文件
	* @return void    返回类型
	* @author: zhzy
	* @date 2016年12月1日 上午10:16:04
	* @throws
	*/
	public static void closeFtp(){
          if (ftpClient!=null && ftpClient.isConnected()) {
             try {
            	 ftpClient.logout();
            	 ftpClient.disconnect();
             } catch (IOException e) {
                 e.printStackTrace();
              }
          }
      }

	/**
	 * @Title: generateFileName @Description:
	 * TODO(得到时间戳的图片信息) @param @param fileName @param @return 设定文件 @return
	 * String 返回类型 @author: zhzy @date 2016年12月1日 上午9:46:35 @throws
	 */
	public static String generateFileName(String fileName) {
		DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		String formatDate = format.format(new Date());
		int random = new Random().nextInt(100000);
		int position = fileName.lastIndexOf(".");
		String extension = fileName.substring(position);
		return formatDate + random + extension;
	}
}
